package com.zzs.common.security.util;

import org.mindrot.jbcrypt.BCrypt;

/**
 * 使用BCrypt加密算法, 每次加密时, Bcrypt都会生成一个独特的盐值,
 * 这个盐值与密码结合, 可以确保即使多个用户使用相同的密码, 加密后的结果也不同, 防止彩虹表攻击;
 * 而且Bcrypt会对密码进行多次哈希处理, 而不是一次性完成, 也可以防止暴力破解.
 * 但它的计算开销和存储空间比较大, 需要60个字符空间.
 * @author zzs
 * @date 2025/03/17
 */
public final class PasswordUtil {

    /**
     * 私有构造函数，防止实例化
     */
    private PasswordUtil() {}

    /**
     * 使用 BCrypt 算法加密密码。
     * @param rawPassword 明文密码
     * @return 返回加密后的密码
     */

    public static String encryptPassword(String rawPassword) {
        return BCrypt.hashpw(rawPassword, BCrypt.gensalt());
    }

    /**
     * 验证原始密码是否与加密后的密码匹配。
     * @param rawPassword 用户输入的明文密码
     * @param encryptPassword 数据库中存储的加密密码
     * @return 如果密码匹配返回 true，否则返回 false
     */
    public static boolean matchesPassword(String rawPassword, String encryptPassword) {
        return BCrypt.checkpw(rawPassword, encryptPassword);
    }
}
